#ifndef NPDM_SWEEP_H
#define NPDM_SWEEP_H

#include "npdm_patterns.h"
#include "npdm_operators.h"

//===========================================================================================================================================================

class Npdm_sweep {

  public:
    Npdm_sweep() {};
    Npdm_sweep(int order, int nsites, Npdm_patterns & npdm_patterns);
    void dmrg_sweep();
    void print_elements();
    bool included_in_dmrg_sweep( std::vector<int> & indices );

  private:
    int nsites_;
    int order_;
    long int repeated_elements_;
    Npdm_patterns npdm_patterns_;
    std::set< std::vector< std::pair<CD,int> > > npdm_elements_;

    void build_block_operators( int dotsite, Npdm_operators & npdm_operators );

    void contract_block_operators( std::vector<CD> & lhs_cd, 
                                   std::vector<CD> & dot_cd, 
                                   std::vector<CD> & rhs_cd, 
                                   Npdm_operators & npdm_operators );

    void build_npdm_element( std::vector< std::pair<CD,int> > & lhs,
                             std::vector< std::pair<CD,int> > & dot,
                             std::vector< std::pair<CD,int> > & rhs);

    void print_opstring( std::vector< std::pair<CD,int> > opstring );

};

//===========================================================================================================================================================

#endif

